<?xml version="1.0"?>
<!-- Copyright (C) 2009-2023 Free Software Foundation, Inc.
     Contributed by ARM Ltd.

     Copying and distribution of this file, with or without modification,
     are permitted in any medium without royalty provided the copyright
     notice and this notice are preserved.  -->

<!DOCTYPE feature SYSTEM "gdb-target.dtd">
<feature name="org.gnu.gdb.aarch64.fpu">
  <vector id="v2d" type="ieee_double" count="2"/>
  <vector id="v2u" type="uint64" count="2"/>
  <vector id="v2i" type="int64" count="2"/>
  <vector id="v4f" type="ieee_single" count="4"/>
  <vector id="v4u" type="uint32" count="4"/>
  <vector id="v4i" type="int32" count="4"/>
  <vector id="v8f" type="ieee_half" count="8"/>
  <vector id="v8u" type="uint16" count="8"/>
  <vector id="v8i" type="int16" count="8"/>
  <vector id="v8bf16" type="bfloat16" count="8"/>
  <vector id="v16u" type="uint8" count="16"/>
  <vector id="v16i" type="int8" count="16"/>
  <vector id="v1u" type="uint128" count="1"/>
  <vector id="v1i" type="int128" count="1"/>
  <union id="vnd">
    <field name="f" type="v2d"/>
    <field name="u" type="v2u"/>
    <field name="s" type="v2i"/>
  </union>
  <union id="vns">
    <field name="f" type="v4f"/>
    <field name="u" type="v4u"/>
    <field name="s" type="v4i"/>
  </union>
  <union id="vnh">
    <field name="bf" type="v8bf16"/>
    <field name="f" type="v8f"/>
    <field name="u" type="v8u"/>
    <field name="s" type="v8i"/>
  </union>
  <union id="vnb">
    <field name="u" type="v16u"/>
    <field name="s" type="v16i"/>
  </union>
  <union id="vnq">
    <field name="u" type="v1u"/>
    <field name="s" type="v1i"/>
  </union>
  <union id="aarch64v">
    <field name="d" type="vnd"/>
    <field name="s" type="vns"/>
    <field name="h" type="vnh"/>
    <field name="b" type="vnb"/>
    <field name="q" type="vnq"/>
  </union>
  <reg name="v0" bitsize="128" type="aarch64v" regnum="34"/>
  <reg name="v1" bitsize="128" type="aarch64v" />
  <reg name="v2" bitsize="128" type="aarch64v" />
  <reg name="v3" bitsize="128" type="aarch64v" />
  <reg name="v4" bitsize="128" type="aarch64v" />
  <reg name="v5" bitsize="128" type="aarch64v" />
  <reg name="v6" bitsize="128" type="aarch64v" />
  <reg name="v7" bitsize="128" type="aarch64v" />
  <reg name="v8" bitsize="128" type="aarch64v" />
  <reg name="v9" bitsize="128" type="aarch64v" />
  <reg name="v10" bitsize="128" type="aarch64v"/>
  <reg name="v11" bitsize="128" type="aarch64v"/>
  <reg name="v12" bitsize="128" type="aarch64v"/>
  <reg name="v13" bitsize="128" type="aarch64v"/>
  <reg name="v14" bitsize="128" type="aarch64v"/>
  <reg name="v15" bitsize="128" type="aarch64v"/>
  <reg name="v16" bitsize="128" type="aarch64v"/>
  <reg name="v17" bitsize="128" type="aarch64v"/>
  <reg name="v18" bitsize="128" type="aarch64v"/>
  <reg name="v19" bitsize="128" type="aarch64v"/>
  <reg name="v20" bitsize="128" type="aarch64v"/>
  <reg name="v21" bitsize="128" type="aarch64v"/>
  <reg name="v22" bitsize="128" type="aarch64v"/>
  <reg name="v23" bitsize="128" type="aarch64v"/>
  <reg name="v24" bitsize="128" type="aarch64v"/>
  <reg name="v25" bitsize="128" type="aarch64v"/>
  <reg name="v26" bitsize="128" type="aarch64v"/>
  <reg name="v27" bitsize="128" type="aarch64v"/>
  <reg name="v28" bitsize="128" type="aarch64v"/>
  <reg name="v29" bitsize="128" type="aarch64v"/>
  <reg name="v30" bitsize="128" type="aarch64v"/>
  <reg name="v31" bitsize="128" type="aarch64v"/>

  <flags id="fpsr_flags" size="4">
    <!-- Invalid Operation cumulative floating-point exception bit.  -->
    <field name="IOC" start="0" end="0"/>
    <!-- Divide by Zero cumulative floating-point exception bit.  -->
    <field name="DZC" start="1" end="1"/>
    <!-- Overflow cumulative floating-point exception bit.  -->
    <field name="OFC" start="2" end="2"/>
    <!-- Underflow cumulative floating-point exception bit.  -->
    <field name="UFC" start="3" end="3"/>
    <!-- Inexact cumulative floating-point exception bit..  -->
    <field name="IXC" start="4" end="4"/>
    <!-- Input Denormal cumulative floating-point exception bit.  -->
    <field name="IDC" start="7" end="7"/>
    <!-- Cumulative saturation bit, Advanced SIMD only.  -->
    <field name="QC" start="27" end="27"/>
    <!-- When AArch32 is supported at any Exception level and AArch32
         floating-point is implemented: Overflow condition flag for AArch32
         floating-point comparison operations.  -->
    <field name="V" start="28" end="28"/>
    <!-- When AArch32 is supported at any Exception level and AArch32
         floating-point is implemented:
         Carry condition flag for AArch32 floating-point comparison operations.
         -->
    <field name="C" start="29" end="29"/>
    <!-- When AArch32 is supported at any Exception level and AArch32
         floating-point is implemented:
         Zero condition flag for AArch32 floating-point comparison operations.
         -->
    <field name="Z" start="30" end="30"/>
    <!-- When AArch32 is supported at any Exception level and AArch32
         floating-point is implemented:
         Negative condition flag for AArch32 floating-point comparison
         operations.  -->
    <field name="N" start="31" end="31"/>
  </flags>
  <reg name="fpsr" bitsize="32" type="fpsr_flags"/>

  <flags id="fpcr_flags" size="4">
    <!-- Flush Inputs to Zero (part of Armv8.7).  -->
    <field name="FIZ" start="0" end="0"/>
    <!-- Alternate Handling (part of Armv8.7).  -->
    <field name="AH" start="1" end="1"/>
    <!-- Controls how the output elements other than the lowest element of the
         vector are determined for Advanced SIMD scalar instructions (part of
         Armv8.7).  -->
    <field name="NEP" start="2" end="2"/>
    <!-- Invalid Operation floating-point exception trap enable.  -->
    <field name="IOE" start="8" end="8"/>
    <!-- Divide by Zero floating-point exception trap enable.  -->
    <field name="DZE" start="9" end="9"/>
    <!-- Overflow floating-point exception trap enable.  -->
    <field name="OFE" start="10" end="10"/>
    <!-- Underflow floating-point exception trap enable.  -->
    <field name="UFE" start="11" end="11"/>
    <!-- Inexact floating-point exception trap enable.  -->
    <field name="IXE" start="12" end="12"/>
    <!-- The value of this bit controls the numeric behaviors of BFloat16 dot
	 product calculations performed by the BFDOT, BFMMLA, BFMOPA, and
	 BFMOPS instructions when FEAT_EBF16 is implemented.  -->
    <field name="EBF" start="13" end="13"/>
    <!-- Input Denormal floating-point exception trap enable.  -->
    <field name="IDE" start="15" end="15"/>
    <!-- This field has no function in AArch64 state, and non-zero values are
	 ignored during execution in AArch64 state.
	 This field is included only for context saving and restoration of
	 the AArch32 FPSCR.Len field.  -->
    <field name="Len" start="16" end="18"/>
    <!-- Flush-to-zero mode control bit on half-precision data-processing
         instructions.  -->
    <field name="FZ16" start="19" end="19"/>
    <!-- This field has no function in AArch64 state, and non-zero values are
	 ignored during execution in AArch64 state.
	 This field is included only for context saving and restoration of the
	 AArch32 FPSCR.Stride field.  -->
    <field name="Stride" start="20" end="21"/>
    <!-- Rounding Mode control field.  -->
    <field name="RMode" start="22" end="23"/>
    <!-- Flush-to-zero mode control bit.  -->
    <field name="FZ" start="24" end="24"/>
    <!-- Default NaN mode control bit.  -->
    <field name="DN" start="25" end="25"/>
    <!-- Alternative half-precision control bit.  -->
    <field name="AHP" start="26" end="26"/>
  </flags>
  <reg name="fpcr" bitsize="32" type="fpcr_flags"/>
</feature>
